package tt.Lematizador.Diccionario;

//package mx.ipn.escom.cdt.bi.util.Diccionario;
import java.io.FileNotFoundException;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Sinonimo {
	private String ArchGenerar;
	private String ArchIndice;
	
	
	public Sinonimo(String ArchGenerar, String ArchIndice){
		//StringTokenizer token = new StringTokenizer(ArchGenerar,".");
		//ArchIndice=token.nextToken()+"ArchIndice."+token.nextToken();
		this.ArchIndice= ArchIndice;
		this.ArchGenerar=ArchGenerar;
	}
	
	public String getArchGenerar() {
		return ArchGenerar;
	}


	public void setArchGenerar(String archGenerar) {
		ArchGenerar = archGenerar;
	}

	public String getArchIndice() {
		return ArchIndice;
	}

	public void setArchIndice(String archIndice) {
		ArchIndice = archIndice;
	}

	public List<String>[] getSinonimos(String palabra){
		palabra= validarPalabra(palabra);
		
		@SuppressWarnings("unchecked")//sabemos que se le asignara una lista <String>
		List<String> sinonimos[] = new List[2];//0= Synonyms //1= associates
		sinonimos[0] = new ArrayList<String>();
		sinonimos[1] = new ArrayList<String>();
		long indices[]=new long[2];
		
		boolean find=false;
		boolean equival=false;
		RandomAccessFile archGenerar = null;
		Pattern p=null;
		Matcher m=null;
		
		if(palabra!=null && !palabra.isEmpty()){
			
			String lineaArchivo=null;
			
			//System.err.println("palabra = " + palabra);
			//System.err.println("palabra.charAt(0) = " + palabra.charAt(0));
			//if (Character.isLetter(palabra.charAt(0))){//Verificamos si es un caracter
				indices=this.getIndiceLetra(palabra.charAt(0));
				
			    try {
				
				   archGenerar = new RandomAccessFile(ArchGenerar,"r");
				   archGenerar.seek(indices[0]);	//se asignan indices
				   if(indices[1]==-2){indices[1]=archGenerar.length();}
				
				   while (archGenerar.getFilePointer() < indices[1] && find==false){
					  lineaArchivo=archGenerar.readLine();
					  p = Pattern.compile("^[-|\\*]");
			          m = p.matcher(lineaArchivo);
			        
			          if (equival==false && !m.find()){
			        	 lineaArchivo=analizar(lineaArchivo);
			        	 equival=lineaArchivo.equals(palabra);
			          }
			          else if( equival==true){//linea con * o -
			        	//System.out.println("HOLA " + lineaArchivo );
			        	p = Pattern.compile("^-");
			        	m = p.matcher(lineaArchivo);
			        		if(m.find()){//sinonimos
			        			StringBuffer sb = new StringBuffer();  //eliminando -
			        			m.appendReplacement(sb, "");
			        			m.appendTail(sb);
			        			lineaArchivo = sb.toString();
		        	        
			        			dividir(lineaArchivo,sinonimos[0]);

			        		}
			        		else{
			        			p = Pattern.compile("^\\*");
			        			m = p.matcher(lineaArchivo);
			        			if(m.find()){ 
			        				StringBuffer sb = new StringBuffer();  //eliminando *
			        				m.appendReplacement(sb, "");
			        				m.appendTail(sb);
			        				lineaArchivo = sb.toString();			        	        
			        				dividir(lineaArchivo,sinonimos[1]);
			        			
			        			}
			        			else{
			        				equival=false;
			        				find=true;
			        			}
			        		}
			          }
			        
				   }
			
			    } catch (FileNotFoundException e) {
				//System.out.println("SINONIMO:  Error al leer el archivo, Arhivo "+ this.ArchGenerar+" o " +this.ArchIndice + " no encontrado");
			    } catch (IOException e) {
			    	//System.out.println("Error");
			    } finally{
			    	try{
			    		archGenerar.close();
			    	}catch(IOException e){
					e.printStackTrace();
			    	}
			    }
			//}
		}
		return sinonimos;
	}
	
	
	private String analizar(String palabra) {
		Pattern p = Pattern.compile("|");
  	Matcher m = p.matcher(palabra);
  	if(m.find()){
  		StringTokenizer token = new StringTokenizer(palabra,"|");
  		palabra=token.nextToken();
  	}
		return palabra;
	}

	private void dividir(String Cadena,List<String> separadas){
		StringTokenizer token = new StringTokenizer(Cadena,"|");
		while(token.hasMoreTokens()){
			String palabra = ((String) token.nextToken()).trim();
			if(!palabra.isEmpty()){
				separadas.add(palabra);
				//System.out.println("|"+palabra+"|");
			}
		}
		
	}

	private String validarPalabra(String palabra) {
		int i=0;
		if (palabra != null){
			palabra = palabra.trim();
			palabra = palabra.toLowerCase();
		
			Pattern p = Pattern.compile("[A-Za-z]");
			Matcher m = p.matcher(palabra);
			if (m.find()==false){
				palabra = null;
			}
		}
		return palabra;
	}

	private long[] getIndiceLetra(char letra){ //obtiene el indice de acuerdo a la letra indicada
	System.out.println("LETRA = " + letra);
		
		switch(letra){
			case 'á':{letra='a';break;}
			case 'é':{letra='e';break;}
			case 'í':{letra='i';break;}
			case 'ó':{letra='o';break;}
			case 'ú':{letra='u';break;}
		}
		long indices[]=new long[2];
		indices[0]=0; //[0] es el indice de inicio
		indices [1]=-1;// [1] es el indice final
		char letraLeida = '\0';
		String lineaIndice=null;
		RandomAccessFile archIndices = null;
		boolean finAsignado=false;
		
		try {
			//System.err.println("SINONIMOS");
			archIndices = new RandomAccessFile(ArchIndice,"r");
			//System.err.println("archIndices.getFilePointer() = " + archIndices.getFilePointer() + " < " + "archIndices.length()=" + archIndices.length());
			if(letra=='!'||letra=='"'||letra=='#'||letra=='$'||letra=='&'||letra=='%'||letra=='{'||letra=='}'||letra=='^'||letra=='1'||letra=='2'||letra=='3'||letra=='4'||letra=='5'||letra=='6'||letra=='7'||letra=='8'||letra=='9'||letra=='0'||letra=='\'')
				letra='a';
			if(letra=='r')
				letra='r';
			while (archIndices.getFilePointer() < archIndices.length() && finAsignado==false&&archIndices.getFilePointer()<archIndices.length()) {
				//System.err.println("archIndices.getFilePointer() = " + archIndices.getFilePointer() + " < " + "archIndices.length()=" + archIndices.length());
				lineaIndice=archIndices.readUTF();
				StringTokenizer token = new StringTokenizer(lineaIndice," ");
				letraLeida=token.nextToken().charAt(0);
				//System.err.println("letraLeida = " + letraLeida + " == letra" + letra);
				if(letraLeida==letra){
					indices[0] = new Long(Long.parseLong(token.nextToken()));
					//System.err.println("archIndices.getFilePointer() = " + archIndices.getFilePointer() + " < " + "archIndices.length()=" + archIndices.length());
					if(archIndices.getFilePointer() < archIndices.length()){
							lineaIndice=archIndices.readUTF();
							StringTokenizer tokenfin = new StringTokenizer(lineaIndice," ");
							tokenfin.nextToken();
							indices[1] = new Long(Long.parseLong(tokenfin.nextToken()));
							finAsignado=true;
					}
					else{
						indices[1] = -2;
						finAsignado=true;
					}
				}
			}
			//archIndices.close();
			//System.out.println(indices[0]+ " " +indices[1]);
		} catch (FileNotFoundException e) {
			System.out.println("Error al leer el archivo, Arhivo "+ this.ArchGenerar+" o " +this.ArchIndice + " no encontrado");
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try{
			archIndices.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		
		return indices;
	}
}
